package com.zzyl.nursing.utils;

import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

/**
 * 身份证年龄计算工具类
 */
public class IdCardAgeCalculator {

    // 18位身份证号码正则
    private static final String ID_CARD_18_REGEX = "^[1-9]\\d{5}(19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$";

    // 15位身份证号码正则
    private static final String ID_CARD_15_REGEX = "^[1-9]\\d{7}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}$";

    // 日期格式化器
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");

    /**
     * 根据身份证号计算年龄
     *
     * @param idCard 身份证号码字符串
     * @return 年龄（周岁），如果身份证号无效返回-1
     */
    public static int calculateAge(String idCard) {
        if (!isValidIdCard(idCard)) {
            return -1;
        }

        try {
            String birthDateStr = extractBirthDate(idCard);
            LocalDate birthDate = LocalDate.parse(birthDateStr, DATE_FORMATTER);
            LocalDate currentDate = LocalDate.now();

            // 计算周岁年龄
            return Period.between(birthDate, currentDate).getYears();
        } catch (DateTimeParseException e) {
            return -1;
        }
    }

    /**
     * 验证身份证号格式是否有效
     *
     * @param idCard 身份证号码
     * @return 是否有效
     */
    public static boolean isValidIdCard(String idCard) {
        if (idCard == null || idCard.trim().isEmpty()) {
            return false;
        }

        // 统一去除空格
        idCard = idCard.trim();

        // 检查18位或15位身份证格式
        return idCard.matches(ID_CARD_18_REGEX) || idCard.matches(ID_CARD_15_REGEX);
    }

    /**
     * 从身份证号中提取出生日期字符串(yyyyMMdd)
     *
     * @param idCard 身份证号码
     * @return 出生日期字符串
     */
    private static String extractBirthDate(String idCard) {
        idCard = idCard.trim();

        if (idCard.length() == 18) {
            // 18位身份证：第7-14位是出生日期
            return idCard.substring(6, 14);
        } else {
            // 15位身份证：第7-12位是出生日期(缺19)
            return "19" + idCard.substring(6, 12);
        }
    }
}